package lu.med.praxiswahl.wahlumed.client.rechnungen.op.model;

import java.util.List;

import lu.med.praxiswahl.wahlumed.client.utilities.ContextFactoryRemote;
import lu.med.praxiswahl.wahlumed.model.beans.OPBillContentsTBL;
import lu.med.praxiswahl.wahlumed.model.beans.OPCodeRateTBL;
import lu.med.praxiswahl.wahlumed.model.beans.OPSettlementTBL;
import lu.med.praxiswahl.wahlumed.service.beans.serviceinterface.OPBillContentServiceInt;
import lu.med.praxiswahl.wahlumed.service.beans.serviceinterface.OPBillServiceInt;

/**
 * @author pkendzo
 *
 */
public class OPBillDataset
{

    private String[][] dataRow;

    private Long rechnung_nummer;

    private Long[] dataRowID;

    private ContextFactoryRemote remote;
    private OPBillContentServiceInt opBillContentService;
    private OPBillServiceInt opBillService;

    public OPBillDataset()
    {

	remote = new ContextFactoryRemote();
	opBillContentService = remote.getRemoteOPBillContentServiceInt();
	opBillService = remote.getRemoteOPBillServiceInt();

	rechnung_nummer = 0l;

	dataRow = new String[10][9];

	/*
	 * Beinhaltet die IDs von Objekten des Typs OPBillsTBL. Die restlichen
	 * Werten/Values werden in dataRow gespeichert.
	 */
	this.dataRowID = new Long[dataRow.length];

	for (int i = 0; i < 10; i++)
	{
	    for (int j = 0; j < 9; j++)
	    {
		dataRow[i][j] = "";
	    }
	}
    }

    public void clearDataSet()
    {
	/*
	 * Beinhaltet die IDs von Objekten des Typs OPBillsTBL. Die restlichen
	 * Werten/Values werden in dataRow gespeichert.
	 */
	this.dataRowID = new Long[dataRow.length];

	for (int i = 0; i < 10; i++)
	{
	    for (int j = 0; j < 9; j++)
	    {
		dataRow[i][j] = "";
	    }
	    this.dataRowID[i] = null;
	}
    }

    /**
     * @return the dataRow
     */
    public String[][] getDataRow()
    {
	return dataRow;
    }

    /**
     * @param dataRow
     *            the dataRow to set
     */
    public void setDataRow(String[][] dataRow)
    {
	this.dataRow = dataRow;
    }

    public void setDataRow(String data, int row, int column)
    {
	this.dataRow[row][column] = data;
    }

    /**
     * @return the rechnung_nummer
     */
    public Long getRechnung_nummer()
    {
	return rechnung_nummer;
    }

    /**
     * @param rechnungNummer
     *            the rechnung_nummer to set
     */
    public void setRechnung_nummer(Long rechnungNummer)
    {
	rechnung_nummer = rechnungNummer;
    }

    /**
     * @return the dataRowID
     */
    public Long[] getDataRowID()
    {
	return dataRowID;
    }

    /**
     * @param dataRowID
     *            the dataRowID to set
     */
    public void setDataRowID(Long[] dataRowID)
    {
	this.dataRowID = dataRowID;
    }

    /*
     * ruft den Inhalte von einem Rechnung ab
     */
    public void retrieveBillDataFromDB()
    {
	List<OPBillContentsTBL> billContent = this.opBillContentService
		.getBillsContentItemsByOPBillNumber(this.rechnung_nummer);

	this.clearDataSet();

	for (int i = 0; i < billContent.size(); i++)
	{
	    /*
	     * Laden des IDs
	     */
	    this.dataRowID[i] = billContent.get(i).getOpbillsContentsID();

	    this.dataRow[i][0] = billContent.get(i).getH();
	    this.dataRow[i][1] = billContent.get(i).getMed();
	    this.dataRow[i][2] = billContent.get(i).getDate_dent_heure();
	    this.dataRow[i][3] = billContent.get(i).getCode_rate()
		    .getCode_label();
	    this.dataRow[i][4] = "" + billContent.get(i).getAnzahl();
	    this.dataRow[i][5] = "" + billContent.get(i).getMontant();
	    this.dataRow[i][6] = billContent.get(i).getMed_pres();
	    this.dataRow[i][7] = billContent.get(i).getSettlement_code()
		    .getCode_label();
	    this.dataRow[i][8] = billContent.get(i).getCode_rate()
	    .getBase_price();
	    
	  /*  if(BillFunctionPanel.selectedClassBoxIndex == 1)
	    {
		this.dataRow[i][8] = billContent.get(i).getCode_rate()
		    .getBase_price();
	    }
	    else if(BillFunctionPanel.selectedClassBoxIndex == 2)
	    {
		this.dataRow[i][8] = billContent.get(i).getCode_rate()
		    .getBase_price_2cl();
	    }
	    */
	    
	}
    }

    public int countFilledRows()
    {
	int c = 0;
	for (int i = 0; i < dataRow.length; i++)
	{
	    if (!dataRow[i][3].equals(""))
		c++;
	}
	return c;
    }

    /*
     * Speichert der Inhalte einer Rechnung nach Eingabe/Update in die DB ab
     */
    public void saveBillDataInDB()
    {

	OPBillContentsTBL[] tbl = new OPBillContentsTBL[this.countFilledRows()];

	if (dataRowID.length > 0)
	{
	    for (int i = 0; i < tbl.length; i++)
	    {
		if (dataRowID[i] != null)
		{
		    tbl[i] = new OPBillContentsTBL();
		    OPCodeRateTBL codeRate = new OPCodeRateTBL();

		    codeRate.setCode_label(dataRow[i][3]);
		    tbl[i].setCode_rate(codeRate);

		    tbl[i].setDate_dent_heure(dataRow[i][2]);
		    tbl[i].setH(dataRow[i][0]);
		    tbl[i].setMed(dataRow[i][1]);
		    tbl[i].setMed_pres(dataRow[i][6]);

		    double tarifBetrag = 0.0;
		    try
		    {
			tarifBetrag = Double.parseDouble(dataRow[i][5]);
		    }
		    catch (NumberFormatException e)
		    {
			tarifBetrag = 0.0;
		    }

		    tbl[i].setMontant(tarifBetrag);

		    int number = 0;
		    try
		    {
			number = Integer.parseInt(dataRow[i][4]);
		    }
		    catch (NumberFormatException ie)
		    {
			number = 0;
		    }

		    // tbl[i].setAnzahl(Integer.parseInt(dataRow[i][4]));
		    tbl[i].setAnzahl(number);

		    OPSettlementTBL code = new OPSettlementTBL();
		    code.setCode_label(dataRow[i][7]);
		    
		    tbl[i].setSettlement_code(code);

		    tbl[i].setRechnungs_nummer(this.opBillService
			    .retrieveOPBillByID(this.rechnung_nummer));

		    tbl[i].setOpbillsContentsID(dataRowID[i]);

		    this.opBillContentService.updateOPBillContents(tbl[i]);
		    /*
		     * if (dataRowID[i] == null) { tbla.add(tbl[i]);
		     * 
		     * } else { tbl[i].setOpbillsContentsID(dataRowID[i]);
		     * 
		     * this.opBillContentService.updateOPBillContents(tbl[i]); }
		     */
		}

		else
		{
		    tbl[i] = new OPBillContentsTBL();
		    OPCodeRateTBL codeRate = new OPCodeRateTBL();

		    codeRate.setCode_label(dataRow[i][3]);
		    tbl[i].setCode_rate(codeRate);

		    tbl[i].setDate_dent_heure(dataRow[i][2]);
		    tbl[i].setH(dataRow[i][0]);
		    tbl[i].setMed(dataRow[i][1]);
		    tbl[i].setMed_pres(dataRow[i][6]);

		    double tarifBetrag = 0.0;
		    try
		    {
			tarifBetrag = Double.parseDouble(dataRow[i][5]);
		    }
		    catch (NumberFormatException e)
		    {
			tarifBetrag = 0.0;
		    }

		    tbl[i].setMontant(tarifBetrag);

		    int number = 0;
		    try
		    {
			number = Integer.parseInt(dataRow[i][4]);
		    }
		    catch (NumberFormatException ie)
		    {
			number = 0;
		    }

		    // tbl[i].setAnzahl(Integer.parseInt(dataRow[i][4]));
		    tbl[i].setAnzahl(number);

		    OPSettlementTBL code = new OPSettlementTBL();
		    code.setCode_label(dataRow[i][7]);

		    tbl[i].setSettlement_code(code);

		    tbl[i].setRechnungs_nummer(this.opBillService
			    .retrieveOPBillByID(this.rechnung_nummer));

		    this.opBillContentService.createBillContents(tbl[i]);
		}
	    }
	}

	/*
	 * OPBillContentsTBL[] to = new OPBillContentsTBL[tbla.size()];
	 * 
	 * for (int i = 0; i < tbla.size(); i++) { to[i] = tbla.get(i);
	 * this.opBillContentService.createBillContents(to[i]); }
	 */

    }
    
    public void deleteBillContentItem(Long id)
    {
	this.opBillContentService.removeOPBillContentItem(id);
    }

}
